/*
 * VentanaFeed.java
 */
package ui;

import controladores.Fachada;
import io.Feed;
import io.SubscriptionDTO;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.table.DefaultTableModel;
import persistencia.DAOException;


/**
 * Clase que representa la interfaz gráfica de usuario (GUI) para la aplicación.
 * 
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public class VentanaFeed extends javax.swing.JFrame {

    /** Cronstructor de la clase */
    public VentanaFeed() {
        initComponents();
        this.disenoGrafico();
        this.controlador= new Fachada();
        /* Ocultamos los JDialog que se encargan de administrar las suscripciones */
        altaSubscription.setVisible(false);
        modificarSubscription.setVisible(false);
        eliminarSubscription.setVisible(false);
        /* Insertamos los nombres de las columnas para tablaSubscriptions */
        this.modeloTablaSubscriptions.addColumn("Nombre");
        this.modeloTablaSubscriptions.addColumn("URL");
        this.modeloTablaSubscriptions.addColumn("Activo");
        /*Centramos los JPanel y los JDialog*/
        centrarVentanas();
        /* Insertamos el ListCellRenderer custom para el JList listListaSubscription */
        listListaSubscription.setCellRenderer(new SubscriptionCellRenderer());
        /* Insertamos el TableCellRenderer custom para el JTable tablaFeeds */
        tablaFeeds.setDefaultRenderer(String.class, new FeedCellRenderer());
        try {
            /* Obtenemos la lista de suscripciones del controlador*/
            listaSubscription = controlador.actualizar(new ArrayList<SubscriptionDTO>());
            /* Actualizamos el JTable tablaSubscriptions*/
            actualizarListadoSubscriptions();
            /* Cargamos el JList listListaSubscription*/
            cargarListaSubscription(listaSubscription);
            /* Informamos mediante un diálogo las suscripciones que tuvieron problemas de lectura*/
            informarLecturasNoExitosas();
            
        } catch (DAOException ex) {
            /* Informamos al usuario que se produjo un error de Base de Datos al leer las suscripciones*/
            errorBaseDatos(ex);
        }
   
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        altaSubscription = new javax.swing.JDialog();
        textoNombre = new javax.swing.JLabel();
        textoUrl = new javax.swing.JLabel();
        checkActivo = new java.awt.Checkbox();
        confirmarAltaSubscription = new javax.swing.JButton();
        campoNombre = new javax.swing.JTextField();
        campoUrl = new javax.swing.JTextField();
        modificarSubscription = new javax.swing.JDialog();
        textoNombreModificado = new javax.swing.JLabel();
        textoUrlModificado = new javax.swing.JLabel();
        checkActivoModificado = new java.awt.Checkbox();
        campoNombreModificado = new javax.swing.JTextField();
        campoUrlModificado = new javax.swing.JTextField();
        confirmarModificarSubscription = new javax.swing.JButton();
        eliminarSubscription = new javax.swing.JDialog();
        textoEliminarSubscription = new javax.swing.JLabel();
        confirmarEliminarSubscription = new javax.swing.JButton();
        cancelarEliminarSubscription = new javax.swing.JButton();
        errorDatosIncompletos = new javax.swing.JDialog();
        textoDatosIncompletos = new javax.swing.JLabel();
        textoTituloDatosIncompletos = new javax.swing.JLabel();
        botonDatosIncompletos = new javax.swing.JButton();
        errorSeleccionSubscription = new javax.swing.JDialog();
        textoSeleccionSubscription = new javax.swing.JLabel();
        textoTituloSeleccionSubscription = new javax.swing.JLabel();
        botonSeleccionSubscription = new javax.swing.JButton();
        errorBD = new javax.swing.JDialog();
        textoErrorDB = new javax.swing.JLabel();
        botonErrorDB = new javax.swing.JButton();
        errorSeleccionFeedLeido = new javax.swing.JDialog();
        textoFeedSinSeleccionar1 = new javax.swing.JLabel();
        textoTituloFeedSinSeleccionar1 = new javax.swing.JLabel();
        botonErrorFeedSinSeleccionar1 = new javax.swing.JButton();
        errorSeleccionFeedNoLeido = new javax.swing.JDialog();
        textoTituloFeedSinSeleccionar2 = new javax.swing.JLabel();
        textoFeedSinSeleccionar2 = new javax.swing.JLabel();
        botonErrorSeleccionFeed2 = new javax.swing.JButton();
        errorBusqueda = new javax.swing.JDialog();
        textoTituloBusqueda = new javax.swing.JLabel();
        textoBusqueda = new javax.swing.JLabel();
        botonErrorBusqueda = new javax.swing.JButton();
        errorVisualizacion = new javax.swing.JDialog();
        textoTituloErrorVisualizacion = new javax.swing.JLabel();
        textoErrorVisualizacion = new javax.swing.JLabel();
        botonErrorVisualizacion = new javax.swing.JButton();
        ayuda = new javax.swing.JDialog();
        textoAyuda = new javax.swing.JLabel();
        botonAyuda = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        errorSO = new javax.swing.JDialog();
        textoSO = new javax.swing.JLabel();
        textoTituloErrorSO = new javax.swing.JLabel();
        botonErrorSO = new javax.swing.JButton();
        errorLecturaFeed = new javax.swing.JDialog();
        textoErrorFeed = new javax.swing.JLabel();
        botonErrorFeed = new javax.swing.JButton();
        errorLecturaSuscripcion = new javax.swing.JDialog();
        textoErrorLectSusc = new javax.swing.JLabel();
        botonErrorLectSusc = new javax.swing.JButton();
        textoErrorLecturaSuscripcion = new javax.swing.JLabel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tablaFeeds = new javax.swing.JTable();
        campoFiltrar = new javax.swing.JTextField();
        botonNavegador = new javax.swing.JButton();
        botonActualizar = new javax.swing.JButton();
        botonMarcarLeido = new javax.swing.JButton();
        botonMarcarNoLeido = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane6 = new javax.swing.JScrollPane();
        jScrollPane4 = new javax.swing.JScrollPane();
        listListaSubscription = new javax.swing.JList();
        jScrollPane7 = new javax.swing.JScrollPane();
        jScrollPane5 = new javax.swing.JScrollPane();
        editorContenidoFeed = new javax.swing.JEditorPane();
        jPanel2 = new javax.swing.JPanel();
        botonAltaSubscription = new javax.swing.JButton();
        botonEliminarSubscription = new javax.swing.JButton();
        botonModificarSubscription = new javax.swing.JButton();
        jScrollPane3 = new javax.swing.JScrollPane();
        tablaSubscriptions = new javax.swing.JTable();
        labelSubscription = new javax.swing.JLabel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        salir = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        acercaDe = new javax.swing.JMenuItem();

        altaSubscription.setTitle("Alta de Suscripción");
        altaSubscription.setAlwaysOnTop(true);
        altaSubscription.setMinimumSize(new java.awt.Dimension(320, 300));
        altaSubscription.setModal(true);

        textoNombre.setText("Nombre:");

        textoUrl.setText("URL:");

        checkActivo.setLabel("Activo");

        confirmarAltaSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        confirmarAltaSubscription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/ok.jpg"))); // NOI18N
        confirmarAltaSubscription.setText("Confirmar Alta");
        confirmarAltaSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                confirmarAltaSubscriptionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout altaSubscriptionLayout = new javax.swing.GroupLayout(altaSubscription.getContentPane());
        altaSubscription.getContentPane().setLayout(altaSubscriptionLayout);
        altaSubscriptionLayout.setHorizontalGroup(
            altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(altaSubscriptionLayout.createSequentialGroup()
                .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(altaSubscriptionLayout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(checkActivo, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(altaSubscriptionLayout.createSequentialGroup()
                                .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(textoNombre)
                                    .addComponent(textoUrl))
                                .addGap(18, 18, 18)
                                .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(campoUrl, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                    .addGroup(altaSubscriptionLayout.createSequentialGroup()
                        .addGap(81, 81, 81)
                        .addComponent(confirmarAltaSubscription, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(160, Short.MAX_VALUE))
        );
        altaSubscriptionLayout.setVerticalGroup(
            altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(altaSubscriptionLayout.createSequentialGroup()
                .addGap(66, 66, 66)
                .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoNombre)
                    .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(25, 25, 25)
                .addGroup(altaSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoUrl)
                    .addComponent(campoUrl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(19, 19, 19)
                .addComponent(checkActivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(27, 27, 27)
                .addComponent(confirmarAltaSubscription)
                .addContainerGap(91, Short.MAX_VALUE))
        );

        modificarSubscription.setTitle("Modificar Suscripción");
        modificarSubscription.setAlwaysOnTop(true);
        modificarSubscription.setMinimumSize(new java.awt.Dimension(320, 300));
        modificarSubscription.setModal(true);

        textoNombreModificado.setText("Nombre:");

        textoUrlModificado.setText("URL:");

        checkActivoModificado.setLabel("Activo");

        confirmarModificarSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        confirmarModificarSubscription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/ok.jpg"))); // NOI18N
        confirmarModificarSubscription.setText("Confirmar Modificación");
        confirmarModificarSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                confirmarModificarSubscriptionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout modificarSubscriptionLayout = new javax.swing.GroupLayout(modificarSubscription.getContentPane());
        modificarSubscription.getContentPane().setLayout(modificarSubscriptionLayout);
        modificarSubscriptionLayout.setHorizontalGroup(
            modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(modificarSubscriptionLayout.createSequentialGroup()
                .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(modificarSubscriptionLayout.createSequentialGroup()
                        .addGap(50, 50, 50)
                        .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(modificarSubscriptionLayout.createSequentialGroup()
                                .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(textoNombreModificado)
                                    .addComponent(textoUrlModificado))
                                .addGap(18, 18, 18)
                                .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modificarSubscriptionLayout.createSequentialGroup()
                                        .addGap(0, 0, Short.MAX_VALUE)
                                        .addComponent(campoNombreModificado, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(campoUrlModificado)))
                            .addComponent(checkActivoModificado, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(modificarSubscriptionLayout.createSequentialGroup()
                        .addGap(99, 99, 99)
                        .addComponent(confirmarModificarSubscription)))
                .addContainerGap(102, Short.MAX_VALUE))
        );
        modificarSubscriptionLayout.setVerticalGroup(
            modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(modificarSubscriptionLayout.createSequentialGroup()
                .addGap(64, 64, 64)
                .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoNombreModificado)
                    .addComponent(campoNombreModificado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(20, 20, 20)
                .addGroup(modificarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoUrlModificado)
                    .addComponent(campoUrlModificado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(23, 23, 23)
                .addComponent(checkActivoModificado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19)
                .addComponent(confirmarModificarSubscription)
                .addContainerGap(73, Short.MAX_VALUE))
        );

        eliminarSubscription.setTitle("Eliminar Suscripción");
        eliminarSubscription.setMinimumSize(new java.awt.Dimension(400, 200));
        eliminarSubscription.setModal(true);

        textoEliminarSubscription.setText("¿Esta seguro que desea eliminar la suscripción seleccionada?");

        confirmarEliminarSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        confirmarEliminarSubscription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/ok.jpg"))); // NOI18N
        confirmarEliminarSubscription.setText("Confirmar");
        confirmarEliminarSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                confirmarEliminarSubscriptionActionPerformed(evt);
            }
        });

        cancelarEliminarSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        cancelarEliminarSubscription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/iconerror (2).jpg"))); // NOI18N
        cancelarEliminarSubscription.setText("Cancelar");
        cancelarEliminarSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelarEliminarSubscriptionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout eliminarSubscriptionLayout = new javax.swing.GroupLayout(eliminarSubscription.getContentPane());
        eliminarSubscription.getContentPane().setLayout(eliminarSubscriptionLayout);
        eliminarSubscriptionLayout.setHorizontalGroup(
            eliminarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(eliminarSubscriptionLayout.createSequentialGroup()
                .addGroup(eliminarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(eliminarSubscriptionLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(confirmarEliminarSubscription)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cancelarEliminarSubscription))
                    .addGroup(eliminarSubscriptionLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(textoEliminarSubscription)))
                .addContainerGap(63, Short.MAX_VALUE))
        );
        eliminarSubscriptionLayout.setVerticalGroup(
            eliminarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(eliminarSubscriptionLayout.createSequentialGroup()
                .addGap(55, 55, 55)
                .addComponent(textoEliminarSubscription)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE)
                .addGroup(eliminarSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(confirmarEliminarSubscription)
                    .addComponent(cancelarEliminarSubscription, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(24, 24, 24))
        );

        errorDatosIncompletos.setAlwaysOnTop(true);
        errorDatosIncompletos.setMinimumSize(new java.awt.Dimension(340, 200));
        errorDatosIncompletos.setModal(true);

        textoDatosIncompletos.setText("Debe completar los datos solicitados");

        textoTituloDatosIncompletos.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloDatosIncompletos.setText(" DATOS INCOMPLETOS.");

        botonDatosIncompletos.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonDatosIncompletos.setText("Aceptar");
        botonDatosIncompletos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonDatosIncompletosActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorDatosIncompletosLayout = new javax.swing.GroupLayout(errorDatosIncompletos.getContentPane());
        errorDatosIncompletos.getContentPane().setLayout(errorDatosIncompletosLayout);
        errorDatosIncompletosLayout.setHorizontalGroup(
            errorDatosIncompletosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorDatosIncompletosLayout.createSequentialGroup()
                .addGroup(errorDatosIncompletosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorDatosIncompletosLayout.createSequentialGroup()
                        .addGap(59, 59, 59)
                        .addGroup(errorDatosIncompletosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(textoDatosIncompletos, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoTituloDatosIncompletos, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(errorDatosIncompletosLayout.createSequentialGroup()
                        .addGap(116, 116, 116)
                        .addComponent(botonDatosIncompletos, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(182, Short.MAX_VALUE))
        );
        errorDatosIncompletosLayout.setVerticalGroup(
            errorDatosIncompletosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorDatosIncompletosLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoTituloDatosIncompletos)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(textoDatosIncompletos, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addComponent(botonDatosIncompletos, javax.swing.GroupLayout.DEFAULT_SIZE, 33, Short.MAX_VALUE)
                .addContainerGap())
        );

        errorSeleccionSubscription.setAlwaysOnTop(true);
        errorSeleccionSubscription.setMinimumSize(new java.awt.Dimension(340, 200));
        errorSeleccionSubscription.setModal(true);

        textoSeleccionSubscription.setText("Debe seleccionar una suscripción.");

        textoTituloSeleccionSubscription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloSeleccionSubscription.setText("SUSCRIPCIÓN NO SELECCIONADA");

        botonSeleccionSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonSeleccionSubscription.setText("Aceptar");
        botonSeleccionSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSeleccionSubscriptionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorSeleccionSubscriptionLayout = new javax.swing.GroupLayout(errorSeleccionSubscription.getContentPane());
        errorSeleccionSubscription.getContentPane().setLayout(errorSeleccionSubscriptionLayout);
        errorSeleccionSubscriptionLayout.setHorizontalGroup(
            errorSeleccionSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionSubscriptionLayout.createSequentialGroup()
                .addGroup(errorSeleccionSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorSeleccionSubscriptionLayout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addComponent(textoTituloSeleccionSubscription))
                    .addGroup(errorSeleccionSubscriptionLayout.createSequentialGroup()
                        .addGap(67, 67, 67)
                        .addComponent(textoSeleccionSubscription))
                    .addGroup(errorSeleccionSubscriptionLayout.createSequentialGroup()
                        .addGap(113, 113, 113)
                        .addComponent(botonSeleccionSubscription, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(198, Short.MAX_VALUE))
        );
        errorSeleccionSubscriptionLayout.setVerticalGroup(
            errorSeleccionSubscriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionSubscriptionLayout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(textoTituloSeleccionSubscription)
                .addGap(18, 18, 18)
                .addComponent(textoSeleccionSubscription)
                .addGap(31, 31, 31)
                .addComponent(botonSeleccionSubscription, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );

        errorBD.setAlwaysOnTop(true);
        errorBD.setMinimumSize(new java.awt.Dimension(500, 200));
        errorBD.setModal(true);

        textoErrorDB.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoErrorDB.setText("Error en BD");

        botonErrorDB.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorDB.setText("Aceptar");
        botonErrorDB.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorDBActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorBDLayout = new javax.swing.GroupLayout(errorBD.getContentPane());
        errorBD.getContentPane().setLayout(errorBDLayout);
        errorBDLayout.setHorizontalGroup(
            errorBDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorBDLayout.createSequentialGroup()
                .addGroup(errorBDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorBDLayout.createSequentialGroup()
                        .addGap(54, 54, 54)
                        .addComponent(textoErrorDB, javax.swing.GroupLayout.PREFERRED_SIZE, 410, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(errorBDLayout.createSequentialGroup()
                        .addGap(202, 202, 202)
                        .addComponent(botonErrorDB, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(151, Short.MAX_VALUE))
        );
        errorBDLayout.setVerticalGroup(
            errorBDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorBDLayout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(textoErrorDB)
                .addGap(47, 47, 47)
                .addComponent(botonErrorDB, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(145, Short.MAX_VALUE))
        );

        errorSeleccionFeedLeido.setAlwaysOnTop(true);
        errorSeleccionFeedLeido.setMinimumSize(new java.awt.Dimension(374, 229));
        errorSeleccionFeedLeido.setModal(true);

        textoFeedSinSeleccionar1.setText("Debe seleccionar un feed para marcar como Leído");

        textoTituloFeedSinSeleccionar1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloFeedSinSeleccionar1.setText("FEED NO SELECCIONADO");

        botonErrorFeedSinSeleccionar1.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorFeedSinSeleccionar1.setText("Aceptar");
        botonErrorFeedSinSeleccionar1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorFeedSinSeleccionar1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorSeleccionFeedLeidoLayout = new javax.swing.GroupLayout(errorSeleccionFeedLeido.getContentPane());
        errorSeleccionFeedLeido.getContentPane().setLayout(errorSeleccionFeedLeidoLayout);
        errorSeleccionFeedLeidoLayout.setHorizontalGroup(
            errorSeleccionFeedLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionFeedLeidoLayout.createSequentialGroup()
                .addGroup(errorSeleccionFeedLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorSeleccionFeedLeidoLayout.createSequentialGroup()
                        .addGap(56, 56, 56)
                        .addComponent(textoFeedSinSeleccionar1))
                    .addGroup(errorSeleccionFeedLeidoLayout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addComponent(textoTituloFeedSinSeleccionar1))
                    .addGroup(errorSeleccionFeedLeidoLayout.createSequentialGroup()
                        .addGap(136, 136, 136)
                        .addComponent(botonErrorFeedSinSeleccionar1, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(80, Short.MAX_VALUE))
        );
        errorSeleccionFeedLeidoLayout.setVerticalGroup(
            errorSeleccionFeedLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionFeedLeidoLayout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addComponent(textoTituloFeedSinSeleccionar1)
                .addGap(28, 28, 28)
                .addComponent(textoFeedSinSeleccionar1)
                .addGap(36, 36, 36)
                .addComponent(botonErrorFeedSinSeleccionar1, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(55, Short.MAX_VALUE))
        );

        errorSeleccionFeedNoLeido.setAlwaysOnTop(true);
        errorSeleccionFeedNoLeido.setMinimumSize(new java.awt.Dimension(404, 239));
        errorSeleccionFeedNoLeido.setModal(true);

        textoTituloFeedSinSeleccionar2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloFeedSinSeleccionar2.setText("FEED NO SELECCIONADO");

        textoFeedSinSeleccionar2.setText("Debe seleccionar un Feed para marcar como No Leido");

        botonErrorSeleccionFeed2.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorSeleccionFeed2.setText("Aceptar");
        botonErrorSeleccionFeed2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorSeleccionFeed2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorSeleccionFeedNoLeidoLayout = new javax.swing.GroupLayout(errorSeleccionFeedNoLeido.getContentPane());
        errorSeleccionFeedNoLeido.getContentPane().setLayout(errorSeleccionFeedNoLeidoLayout);
        errorSeleccionFeedNoLeidoLayout.setHorizontalGroup(
            errorSeleccionFeedNoLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionFeedNoLeidoLayout.createSequentialGroup()
                .addGroup(errorSeleccionFeedNoLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorSeleccionFeedNoLeidoLayout.createSequentialGroup()
                        .addGap(61, 61, 61)
                        .addGroup(errorSeleccionFeedNoLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(textoFeedSinSeleccionar2)
                            .addComponent(textoTituloFeedSinSeleccionar2)))
                    .addGroup(errorSeleccionFeedNoLeidoLayout.createSequentialGroup()
                        .addGap(142, 142, 142)
                        .addComponent(botonErrorSeleccionFeed2, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(87, Short.MAX_VALUE))
        );
        errorSeleccionFeedNoLeidoLayout.setVerticalGroup(
            errorSeleccionFeedNoLeidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSeleccionFeedNoLeidoLayout.createSequentialGroup()
                .addGap(33, 33, 33)
                .addComponent(textoTituloFeedSinSeleccionar2)
                .addGap(30, 30, 30)
                .addComponent(textoFeedSinSeleccionar2)
                .addGap(39, 39, 39)
                .addComponent(botonErrorSeleccionFeed2, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(55, Short.MAX_VALUE))
        );

        errorBusqueda.setAlwaysOnTop(true);
        errorBusqueda.setMinimumSize(new java.awt.Dimension(470, 240));
        errorBusqueda.setModal(true);

        textoTituloBusqueda.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloBusqueda.setText("SUSCRIPCIÓN NO SELECCIONADA");

        textoBusqueda.setText("Debe seleccionar una suscripción para realizar la búsqueda de Feeds ");

        botonErrorBusqueda.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorBusqueda.setText("Aceptar");
        botonErrorBusqueda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorBusquedaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorBusquedaLayout = new javax.swing.GroupLayout(errorBusqueda.getContentPane());
        errorBusqueda.getContentPane().setLayout(errorBusquedaLayout);
        errorBusquedaLayout.setHorizontalGroup(
            errorBusquedaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorBusquedaLayout.createSequentialGroup()
                .addGroup(errorBusquedaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorBusquedaLayout.createSequentialGroup()
                        .addGap(48, 48, 48)
                        .addComponent(textoTituloBusqueda))
                    .addGroup(errorBusquedaLayout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addComponent(textoBusqueda)))
                .addContainerGap(102, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, errorBusquedaLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(botonErrorBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(172, 172, 172))
        );
        errorBusquedaLayout.setVerticalGroup(
            errorBusquedaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorBusquedaLayout.createSequentialGroup()
                .addGap(40, 40, 40)
                .addComponent(textoTituloBusqueda)
                .addGap(33, 33, 33)
                .addComponent(textoBusqueda)
                .addGap(30, 30, 30)
                .addComponent(botonErrorBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(56, Short.MAX_VALUE))
        );

        errorVisualizacion.setAlwaysOnTop(true);
        errorVisualizacion.setMinimumSize(new java.awt.Dimension(358, 239));
        errorVisualizacion.setModal(true);

        textoTituloErrorVisualizacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloErrorVisualizacion.setText("FEED NO SELECCIONADO");

        textoErrorVisualizacion.setText("Debe seleccionar un feed para visualizarlo ");

        botonErrorVisualizacion.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorVisualizacion.setText("Aceptar");
        botonErrorVisualizacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorVisualizacionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorVisualizacionLayout = new javax.swing.GroupLayout(errorVisualizacion.getContentPane());
        errorVisualizacion.getContentPane().setLayout(errorVisualizacionLayout);
        errorVisualizacionLayout.setHorizontalGroup(
            errorVisualizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorVisualizacionLayout.createSequentialGroup()
                .addGroup(errorVisualizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorVisualizacionLayout.createSequentialGroup()
                        .addGap(49, 49, 49)
                        .addComponent(textoTituloErrorVisualizacion))
                    .addGroup(errorVisualizacionLayout.createSequentialGroup()
                        .addGap(60, 60, 60)
                        .addComponent(textoErrorVisualizacion))
                    .addGroup(errorVisualizacionLayout.createSequentialGroup()
                        .addGap(133, 133, 133)
                        .addComponent(botonErrorVisualizacion, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(94, Short.MAX_VALUE))
        );
        errorVisualizacionLayout.setVerticalGroup(
            errorVisualizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorVisualizacionLayout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addComponent(textoTituloErrorVisualizacion)
                .addGap(27, 27, 27)
                .addComponent(textoErrorVisualizacion)
                .addGap(35, 35, 35)
                .addComponent(botonErrorVisualizacion, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(60, Short.MAX_VALUE))
        );

        ayuda.setAlwaysOnTop(true);
        ayuda.setMinimumSize(new java.awt.Dimension(493, 309));
        ayuda.setModal(true);

        textoAyuda.setFont(new java.awt.Font("Segoe UI", 1, 14)); // NOI18N
        textoAyuda.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/ayuda.jpg"))); // NOI18N
        textoAyuda.setText("Software \"Noticias Ya\"");

        botonAyuda.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonAyuda.setText("Aceptar");
        botonAyuda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAyudaActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        jLabel2.setText("Versión:      1.0.0");

        jLabel3.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        jLabel3.setText("Creadores: ");

        jLabel5.setText("Garay, Nicolás (nicogaray89@gmail.com)");

        jLabel6.setText("Jacquet, Alejandro (alejandrojacquet@gmail.com)");

        jLabel7.setText("Romani, Rita (ritaromani90@gmail.com)");

        javax.swing.GroupLayout ayudaLayout = new javax.swing.GroupLayout(ayuda.getContentPane());
        ayuda.getContentPane().setLayout(ayudaLayout);
        ayudaLayout.setHorizontalGroup(
            ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ayudaLayout.createSequentialGroup()
                .addGroup(ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(ayudaLayout.createSequentialGroup()
                        .addGap(120, 120, 120)
                        .addComponent(textoAyuda))
                    .addGroup(ayudaLayout.createSequentialGroup()
                        .addGap(55, 55, 55)
                        .addGroup(ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addGroup(ayudaLayout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addGap(18, 18, 18)
                                .addGroup(ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel6)
                                    .addComponent(jLabel5)
                                    .addComponent(jLabel7)))))
                    .addGroup(ayudaLayout.createSequentialGroup()
                        .addGap(187, 187, 187)
                        .addComponent(botonAyuda, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(118, Short.MAX_VALUE))
        );
        ayudaLayout.setVerticalGroup(
            ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ayudaLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoAyuda)
                .addGap(23, 23, 23)
                .addComponent(jLabel2)
                .addGap(18, 18, 18)
                .addGroup(ayudaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel6)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel7)
                .addGap(32, 32, 32)
                .addComponent(botonAyuda, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(60, Short.MAX_VALUE))
        );

        errorSO.setAlwaysOnTop(true);
        errorSO.setMinimumSize(new java.awt.Dimension(340, 200));
        errorSO.setModal(true);

        textoSO.setText("Su sistema operativo no es soportado por la aplicación");

        textoTituloErrorSO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoTituloErrorSO.setText("ERROR SISTEMA OPERATIVO");

        botonErrorSO.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorSO.setText("Aceptar");
        botonErrorSO.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorSOActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorSOLayout = new javax.swing.GroupLayout(errorSO.getContentPane());
        errorSO.getContentPane().setLayout(errorSOLayout);
        errorSOLayout.setHorizontalGroup(
            errorSOLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSOLayout.createSequentialGroup()
                .addGroup(errorSOLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorSOLayout.createSequentialGroup()
                        .addGap(21, 21, 21)
                        .addComponent(textoTituloErrorSO))
                    .addGroup(errorSOLayout.createSequentialGroup()
                        .addGap(80, 80, 80)
                        .addComponent(textoSO))
                    .addGroup(errorSOLayout.createSequentialGroup()
                        .addGap(169, 169, 169)
                        .addComponent(botonErrorSO, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(96, Short.MAX_VALUE))
        );
        errorSOLayout.setVerticalGroup(
            errorSOLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorSOLayout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addComponent(textoTituloErrorSO)
                .addGap(29, 29, 29)
                .addComponent(textoSO)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
                .addComponent(botonErrorSO, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(20, 20, 20))
        );

        errorLecturaFeed.setAlwaysOnTop(true);
        errorLecturaFeed.setMinimumSize(new java.awt.Dimension(500, 200));
        errorLecturaFeed.setModal(true);

        textoErrorFeed.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoErrorFeed.setText("jLabel2");

        botonErrorFeed.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorFeed.setText("Aceptar");
        botonErrorFeed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorFeedActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout errorLecturaFeedLayout = new javax.swing.GroupLayout(errorLecturaFeed.getContentPane());
        errorLecturaFeed.getContentPane().setLayout(errorLecturaFeedLayout);
        errorLecturaFeedLayout.setHorizontalGroup(
            errorLecturaFeedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorLecturaFeedLayout.createSequentialGroup()
                .addGroup(errorLecturaFeedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(errorLecturaFeedLayout.createSequentialGroup()
                        .addGap(74, 74, 74)
                        .addComponent(textoErrorFeed, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(errorLecturaFeedLayout.createSequentialGroup()
                        .addGap(156, 156, 156)
                        .addComponent(botonErrorFeed, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(126, Short.MAX_VALUE))
        );
        errorLecturaFeedLayout.setVerticalGroup(
            errorLecturaFeedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorLecturaFeedLayout.createSequentialGroup()
                .addGap(61, 61, 61)
                .addComponent(textoErrorFeed)
                .addGap(53, 53, 53)
                .addComponent(botonErrorFeed, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(53, Short.MAX_VALUE))
        );

        errorLecturaSuscripcion.setAlwaysOnTop(true);
        errorLecturaSuscripcion.setMinimumSize(new java.awt.Dimension(489, 321));
        errorLecturaSuscripcion.setModal(true);

        textoErrorLectSusc.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        textoErrorLectSusc.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/icono_dialog_error (2).jpg"))); // NOI18N
        textoErrorLectSusc.setText("Lectura No Exitosa en las Siguientes Suscripciones:");

        botonErrorLectSusc.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonErrorLectSusc.setText("Aceptar");
        botonErrorLectSusc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonErrorLectSuscActionPerformed(evt);
            }
        });

        textoErrorLecturaSuscripcion.setText("jLabel4");

        javax.swing.GroupLayout errorLecturaSuscripcionLayout = new javax.swing.GroupLayout(errorLecturaSuscripcion.getContentPane());
        errorLecturaSuscripcion.getContentPane().setLayout(errorLecturaSuscripcionLayout);
        errorLecturaSuscripcionLayout.setHorizontalGroup(
            errorLecturaSuscripcionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorLecturaSuscripcionLayout.createSequentialGroup()
                .addGap(75, 75, 75)
                .addGroup(errorLecturaSuscripcionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textoErrorLectSusc, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 340, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, errorLecturaSuscripcionLayout.createSequentialGroup()
                        .addComponent(botonErrorLectSusc, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(132, 132, 132))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, errorLecturaSuscripcionLayout.createSequentialGroup()
                        .addComponent(textoErrorLecturaSuscripcion)
                        .addGap(166, 166, 166)))
                .addContainerGap(74, Short.MAX_VALUE))
        );
        errorLecturaSuscripcionLayout.setVerticalGroup(
            errorLecturaSuscripcionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(errorLecturaSuscripcionLayout.createSequentialGroup()
                .addGap(40, 40, 40)
                .addComponent(textoErrorLectSusc)
                .addGap(50, 50, 50)
                .addComponent(textoErrorLecturaSuscripcion)
                .addGap(56, 56, 56)
                .addComponent(botonErrorLectSusc, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(91, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("NOTICIAS YA");
        setBackground(new java.awt.Color(255, 255, 255));
        setForeground(new java.awt.Color(255, 255, 255));
        setLocationByPlatform(true);
        setName("NOTICIAS YA");
        setPreferredSize(new java.awt.Dimension(1263, 653));
        setResizable(false);

        jTabbedPane1.setBackground(new java.awt.Color(255, 255, 255));
        jTabbedPane1.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        jTabbedPane1.setPreferredSize(new java.awt.Dimension(1220, 550));

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setPreferredSize(new java.awt.Dimension(1250, 540));

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        tablaFeeds.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N
        tablaFeeds.setModel(modeloTablaFeeds);
        tablaFeeds.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tablaFeeds.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaFeedsMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tablaFeeds);
        tablaFeeds.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        campoFiltrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoFiltrarActionPerformed(evt);
            }
        });

        botonNavegador.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonNavegador.setText("Navegador");
        botonNavegador.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonNavegadorActionPerformed(evt);
            }
        });

        botonActualizar.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonActualizar.setText("Actualizar");
        botonActualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonActualizarActionPerformed(evt);
            }
        });

        botonMarcarLeido.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonMarcarLeido.setText("Marcar Leído");
        botonMarcarLeido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMarcarLeidoActionPerformed(evt);
            }
        });

        botonMarcarNoLeido.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonMarcarNoLeido.setText("Marcar No Leído");
        botonMarcarNoLeido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMarcarNoLeidoActionPerformed(evt);
            }
        });

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ui/resources/iconoBuscar.jpg"))); // NOI18N

        listListaSubscription.setFont(new java.awt.Font("Segoe UI", 1, 14)); // NOI18N
        listListaSubscription.setModel(new DefaultListModel());
        listListaSubscription.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        listListaSubscription.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                listListaSubscriptionMouseClicked(evt);
            }
        });
        jScrollPane4.setViewportView(listListaSubscription);

        jScrollPane6.setViewportView(jScrollPane4);

        jScrollPane7.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        jScrollPane5.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        editorContenidoFeed.setEditable(false);
        jScrollPane5.setViewportView(editorContenidoFeed);

        jScrollPane7.setViewportView(jScrollPane5);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 258, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGap(85, 85, 85)
                                .addComponent(botonActualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(27, 27, 27)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGap(233, 233, 233)
                                .addComponent(botonMarcarLeido, javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonMarcarNoLeido, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(89, 89, 89)
                                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoFiltrar))
                            .addComponent(jScrollPane7, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 905, Short.MAX_VALUE)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(688, 688, 688)
                        .addComponent(botonNavegador, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(15, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(botonMarcarLeido, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(botonMarcarNoLeido, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(botonActualizar, javax.swing.GroupLayout.DEFAULT_SIZE, 32, Short.MAX_VALUE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(2, 2, 2)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addComponent(campoFiltrar))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 208, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 438, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonNavegador, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane1.addTab("  Lectura de Feeds  ", jPanel1);

        jPanel2.setBackground(new java.awt.Color(255, 255, 255));

        botonAltaSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonAltaSubscription.setText("Alta Suscripción");
        botonAltaSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAltaSubscriptionActionPerformed(evt);
            }
        });

        botonEliminarSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonEliminarSubscription.setText("Eliminar Suscripción");
        botonEliminarSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarSubscriptionActionPerformed(evt);
            }
        });

        botonModificarSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        botonModificarSubscription.setText("Modificar Suscripción");
        botonModificarSubscription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonModificarSubscriptionActionPerformed(evt);
            }
        });

        tablaSubscriptions.setModel(this.modeloTablaSubscriptions);
        tablaSubscriptions.setName("Listado de Suscripciones");
        jScrollPane3.setViewportView(tablaSubscriptions);

        labelSubscription.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        labelSubscription.setText("Listado de Suscripciones");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(276, 276, 276)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelSubscription)
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 707, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(232, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(botonModificarSubscription, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonAltaSubscription, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonEliminarSubscription, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(500, 500, 500))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addComponent(botonAltaSubscription)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonModificarSubscription)
                .addGap(11, 11, 11)
                .addComponent(botonEliminarSubscription)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(labelSubscription)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 349, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane1.addTab("  Administrador de Suscripciones  ", jPanel2);

        jMenuBar1.setBackground(new java.awt.Color(147, 195, 242));
        jMenuBar1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 102, 255), 2, true));

        jMenu1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(255, 255, 255), 2, true));
        jMenu1.setText("  Archivo  ");
        jMenu1.setFont(new java.awt.Font("Segoe UI", 1, 14)); // NOI18N

        salir.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        salir.setText("Salir");
        salir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                salirActionPerformed(evt);
            }
        });
        jMenu1.add(salir);

        jMenuBar1.add(jMenu1);

        jMenu2.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(255, 255, 255), 2, true));
        jMenu2.setText("  Ayuda  ");
        jMenu2.setFont(new java.awt.Font("Segoe UI", 1, 14)); // NOI18N

        acercaDe.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        acercaDe.setText("Acerca de");
        acercaDe.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                acercaDeActionPerformed(evt);
            }
        });
        jMenu2.add(acercaDe);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(33, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 569, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(45, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Método privado que permite ejecutar sentencias relacionadas con la parte
     * gráfica de la interfaz.
     */
    private void disenoGrafico(){
        this.getContentPane().setBackground(Color.WHITE);
    }
    
    /**
     * Método que se ejecuta al presionar el botón actualizar del panel Lectura
     * de Feeds.
     *
     * @param evt
     */
    private void botonActualizarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonActualizarActionPerformed
        try {
            List<SubscriptionDTO> listaSubscriptionNueva = controlador.actualizar(listaSubscription);
            listaSubscription = listaSubscriptionNueva;
            cargarListaSubscription(listaSubscription);
        } catch (DAOException ex) {
            errorBaseDatos(ex);
        }
        cargarListaSubscription(listaSubscription);
        informarLecturasNoExitosas();
        
    }//GEN-LAST:event_botonActualizarActionPerformed

    /**
     * Método que se ejecuta al seleccionar una suscripción en el JList
     * listListaSubscription del panel Lectura de Feeds.
     *
     * @param evt
     */
    private void listListaSubscriptionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listListaSubscriptionMouseClicked
        int subscriptionInteger = this.listListaSubscription.getSelectedIndex();
        if (subscriptionInteger > -1) {
            SubscriptionDTO subscription = (SubscriptionDTO) this.listListaSubscription.getModel().getElementAt(subscriptionInteger);
            cargarTablaFeeds(subscription.getListaFeeds());
        }
    }//GEN-LAST:event_listListaSubscriptionMouseClicked

    /**
     * Método que se ejecuta al seleccionar un feed en la JTable tablaFeeds.
     * 
     * @param evt 
     */
    private void tablaFeedsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaFeedsMouseClicked
        int feedInteger = this.tablaFeeds.getSelectedRow();
        if(feedInteger > -1) {
            Feed feed = modeloTablaFeeds.getFeed(feedInteger);
            feed.setAbierto(true);
            // Refresca la tablaFeeds para mostrar el feed leido de una manera distinta
            tablaFeeds.repaint();
            editorContenidoFeed.setContentType(feed.getTipoDescripcion());
            editorContenidoFeed.setText(feed.getDescripcion());
        }      
    }//GEN-LAST:event_tablaFeedsMouseClicked

    /**
     * Método que se ejecuta al presionar el botón de alta de suscripción en el
     * panel Administración de Suscripciones. Muestra el dialogo
     * altaSubscription.
     *
     * @param evt
     */
    private void botonAltaSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAltaSubscriptionActionPerformed
        this.campoNombre.setText("");
        this.campoUrl.setText("");
        this.checkActivo.setState(false);
        altaSubscription.setVisible(true);
    }//GEN-LAST:event_botonAltaSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de eliminar suscripción en el
     * panel Administración de Suscripciones. Muestra el dialogo
     * eliminarSubscription, o errorSeleccionSubscription en el caso de no haber
     * seleccionado ninguna suscripción.
     *
     * @param evt
     */
    private void botonEliminarSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarSubscriptionActionPerformed
        if(this.tablaSubscriptions.getSelectedRow()== -1){
            this.errorSeleccionSubscription.setVisible(true);
        }
        else{
            eliminarSubscription.setVisible(true);
        }
    }//GEN-LAST:event_botonEliminarSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de modificar suscripción en el
     * panel Administración de Suscripciones. Muestra el dialogo
     * modificarSubscription, o errorSeleccionSubscription en el caso de no haber
     * seleccionado ninguna suscripción.
     *
     * @param evt
     */
    private void botonModificarSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonModificarSubscriptionActionPerformed
        if (this.tablaSubscriptions.getSelectedRow() == -1) {
            this.errorSeleccionSubscription.setVisible(true);
        } else {

            this.campoNombreModificado.setText(this.modeloTablaSubscriptions.getValueAt(this.tablaSubscriptions.getSelectedRow(), 0).toString());
            this.campoUrlModificado.setText(this.modeloTablaSubscriptions.getValueAt(this.tablaSubscriptions.getSelectedRow(), 1).toString());
            this.checkActivoModificado.setState(this.modeloTablaSubscriptions.getValueAt(this.tablaSubscriptions.getSelectedRow(), 2).toString().equals("Si"));
            modificarSubscription.setVisible(true);
        }    
    }//GEN-LAST:event_botonModificarSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmar alta de suscripción en el
     * dialogo altaSubscription. 
     *
     * @param evt
     */
    private void confirmarAltaSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_confirmarAltaSubscriptionActionPerformed
        try {
            if (this.campoNombre.getText().equals("") || (this.campoUrl.getText().equals(""))) {
                this.errorDatosIncompletos.setVisible(true);
            } else {
                this.controlador.nuevaSubscription(this.campoNombre.getText(), this.campoUrl.getText(), this.checkActivo.getState());
                altaSubscription.setVisible(false);
                this.actualizarListadoSubscriptions();
            }
        } catch (DAOException ex) {
            this.altaSubscription.setVisible(false);
            this.errorBaseDatos(ex);
        }
    }//GEN-LAST:event_confirmarAltaSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmar modificación de suscripción en el
     * dialogo modificarSubscription. 
     *
     * @param evt
     */
    private void confirmarModificarSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_confirmarModificarSubscriptionActionPerformed
        try {
            this.controlador.actualizarSubscription(this.modeloTablaSubscriptions.getValueAt(this.tablaSubscriptions.getSelectedRow(), 0).toString(), this.campoNombreModificado.getText(), this.campoUrlModificado.getText(), this.checkActivoModificado.getState());
            this.modificarSubscription.setVisible(false);
            this.campoNombreModificado.setText("");
            this.campoUrlModificado.setText("");
            this.checkActivoModificado.setState(false);
            this.actualizarListadoSubscriptions();
        } catch (DAOException ex) {
            this.errorBaseDatos(ex);
        }
    }//GEN-LAST:event_confirmarModificarSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmar eliminación de suscripción en el
     * dialogo eliminarSubscription. 
     *
     * @param evt
     */
    private void confirmarEliminarSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_confirmarEliminarSubscriptionActionPerformed
        try {
            this.controlador.eliminarSubscription(this.modeloTablaSubscriptions.getValueAt(this.tablaSubscriptions.getSelectedRow(), 0).toString());
            this.eliminarSubscription.setVisible(false);
            this.actualizarListadoSubscriptions();
        } catch (DAOException ex) {
            this.errorBaseDatos(ex);
        }
    }//GEN-LAST:event_confirmarEliminarSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de cancelar eliminación de suscripción en el
     * dialogo eliminarSubscription. 
     *
     * @param evt
     */
    private void cancelarEliminarSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelarEliminarSubscriptionActionPerformed
        this.eliminarSubscription.setVisible(false);
    }//GEN-LAST:event_cancelarEliminarSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el dialogo
     * errorDatosIncompletos.
     *
     * @param evt
     */
    private void botonDatosIncompletosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonDatosIncompletosActionPerformed
        this.errorDatosIncompletos.setVisible(false);
    }//GEN-LAST:event_botonDatosIncompletosActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el dialogo
     * errorSeleccionSubscription.
     *
     * @param evt
     */
    private void botonSeleccionSubscriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSeleccionSubscriptionActionPerformed
        this.errorSeleccionSubscription.setVisible(false);
    }//GEN-LAST:event_botonSeleccionSubscriptionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el dialogo
     * errorBD.
     *
     * @param evt
     */
    private void botonErrorDBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorDBActionPerformed
        this.errorBD.setVisible(false);
    }//GEN-LAST:event_botonErrorDBActionPerformed

    /**
     * Método que se ejecuta al presionar enter en el campoFiltrar para realizar un filtro sobre los feeds.
     * Busca la palabra en los títulos del feed y en su descripción.
     * 
     * @param evt 
     */
    private void campoFiltrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoFiltrarActionPerformed
        String cadenaABuscar = this.campoFiltrar.getText().trim().toLowerCase();
        int subscriptionInteger = this.listListaSubscription.getSelectedIndex();
        if (subscriptionInteger == -1) {
            errorBusqueda.setVisible(true);
        } else {
            List<Feed> listaFeedsCompleta;
            List<Feed> listaFeedsFiltrada = new ArrayList<Feed>();
            SubscriptionDTO subscription = (SubscriptionDTO) this.listListaSubscription.getModel().getElementAt(subscriptionInteger);
            listaFeedsCompleta = subscription.getListaFeeds();
            Iterator<Feed> iterator = listaFeedsCompleta.iterator();
            while (iterator.hasNext()) {
                Feed feed = iterator.next();
                if ((feed.getTitulo().toLowerCase().contains(cadenaABuscar))
                        || (feed.getDescripcion().toLowerCase().contains(cadenaABuscar))) {
                    listaFeedsFiltrada.add(feed);
                }
            }
            this.cargarTablaFeeds(listaFeedsFiltrada);
        }
    }//GEN-LAST:event_campoFiltrarActionPerformed

    /**
     * Método que se ejecuta al presionar el botón marcar leído en el panel
     * Lectura de Feeds. Setea el atributo "abierto" de un feed en true.
     *
     * @param evt
     */
    private void botonMarcarLeidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMarcarLeidoActionPerformed
        int feedInteger = this.tablaFeeds.getSelectedRow();
        if(feedInteger > -1) {
            Feed feed = modeloTablaFeeds.getFeed(feedInteger);
            feed.setAbierto(true);
            // Refresca la tablaFeeds para mostrar el feed leido de una manera distinta
            tablaFeeds.repaint();
        }    
        else{
            errorSeleccionFeedLeido.setVisible(true);
        }
    }//GEN-LAST:event_botonMarcarLeidoActionPerformed

    /**
     * Método que se ejecuta al presionar el botón marcar no leído en el panel
     * Lectura de Feeds. Setea el atributo "abierto" de un feed en false.
     *
     * @param evt
     */
    private void botonMarcarNoLeidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMarcarNoLeidoActionPerformed
        int feedInteger = this.tablaFeeds.getSelectedRow();
        if(feedInteger > -1) {
            Feed feed = modeloTablaFeeds.getFeed(feedInteger);
            feed.setAbierto(false);
            // Refresca la tablaFeeds para mostrar el feed leido de una manera distinta
            tablaFeeds.repaint();
        }    
        else{
            errorSeleccionFeedNoLeido.setVisible(true);
        }
    }//GEN-LAST:event_botonMarcarNoLeidoActionPerformed

    /**
     * Método que se ejecuta al presionar el botón navegador en el panel Lectura
     * de Feeds. A partir de la url del feed, abre el mismo en el navegador por
     * defecto del sistema operativo.
     *
     * @param evt
     */
    private void botonNavegadorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonNavegadorActionPerformed
        int feedInteger = this.tablaFeeds.getSelectedRow();
        if(feedInteger > -1) {
            Feed feed = modeloTablaFeeds.getFeed(feedInteger);
            /* Obtenemos la url del feed seleccionado */
            String url = feed.getURL();
            /* Obtenemos el nombre del Sistema Operativo */
            String os = System.getProperty("os.name").toLowerCase();

            Runtime rt = Runtime.getRuntime();
            try {
                /*Para Sistema Operativo Windows*/
                if (os.indexOf("win") >= 0) {
                    /* Permite abrir la url del feed en el buscador por defecto,
                     * utilizando para ello la url.dll de windows
                     */
                    rt.exec("rundll32 url.dll,FileProtocolHandler " + url);
                } else if (os.indexOf("mac") >= 0) {
                    rt.exec("open " + url);
                } else if (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) {
                    String[] browsers = {"epiphany", "firefox", "mozilla", "konqueror",
                        "netscape", "opera", "links", "lynx"};
                    StringBuilder cmd = new StringBuilder();
                    for (int i = 0; i < browsers.length; i++) {
                        cmd.append((i == 0 ? "" : " || ") + browsers[i] + " \"" + url + "\" ");
                    }
                    rt.exec(new String[]{"sh", "-c", cmd.toString()});
                } else {
                    errorSO.setVisible(true);
                }
            } catch (Exception ex) {
                errorLecturaFeed.setVisible(true);
                textoErrorFeed.setText(ex.getMessage());
            }
        }    
        else{
            errorVisualizacion.setVisible(true);
        }
    }//GEN-LAST:event_botonNavegadorActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo eliminarSeleccionFeedLeido. 
     * 
     * @param evt 
     */
    private void botonErrorFeedSinSeleccionar1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorFeedSinSeleccionar1ActionPerformed
        this.errorSeleccionFeedLeido.setVisible(false);
    }//GEN-LAST:event_botonErrorFeedSinSeleccionar1ActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo eliminarSeleccionFeedNoLeido. 
     * 
     * @param evt 
     */
    private void botonErrorSeleccionFeed2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorSeleccionFeed2ActionPerformed
        this.errorSeleccionFeedNoLeido.setVisible(false);
    }//GEN-LAST:event_botonErrorSeleccionFeed2ActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo errorBusqueda. 
     * 
     * @param evt 
     */
    private void botonErrorBusquedaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorBusquedaActionPerformed
        this.errorBusqueda.setVisible(false);
    }//GEN-LAST:event_botonErrorBusquedaActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo errorVisualizacion. 
     * 
     * @param evt 
     */
    private void botonErrorVisualizacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorVisualizacionActionPerformed
        this.errorVisualizacion.setVisible(false);
    }//GEN-LAST:event_botonErrorVisualizacionActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo ayuda. 
     * 
     * @param evt 
     */
    private void botonAyudaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAyudaActionPerformed
        this.ayuda.setVisible(false);
    }//GEN-LAST:event_botonAyudaActionPerformed

    /**
     * Método que se ejecuta cuando se selecciona la opción Ayuda-Acerca De en
     * el Menú.
     *
     * @param evt
     */
    private void acercaDeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_acercaDeActionPerformed
        this.ayuda.setVisible(true);
    }//GEN-LAST:event_acercaDeActionPerformed

    /**
     * Método que se ejecuta cuando se selecciona la opción Archivo-Salir en
     * el Menú.
     *
     * @param evt
     */
    private void salirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_salirActionPerformed
        System.exit(0);
    }//GEN-LAST:event_salirActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo errorSO. 
     * 
     * @param evt 
     */
    private void botonErrorSOActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorSOActionPerformed
        this.errorSO.setVisible(false);
    }//GEN-LAST:event_botonErrorSOActionPerformed

    /**
     * Método que se ejecuta al presionar el botón de confirmación en el
     * dialogo errorLecturaFeed. 
     * 
     * @param evt 
     */
    private void botonErrorFeedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorFeedActionPerformed
        this.errorLecturaFeed.setVisible(false);
    }//GEN-LAST:event_botonErrorFeedActionPerformed

    private void botonErrorLectSuscActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonErrorLectSuscActionPerformed
        this.errorLecturaSuscripcion.setVisible(false);
    }//GEN-LAST:event_botonErrorLectSuscActionPerformed

 
    // Métodos para el panel Administración de Suscripciones
 
    /**
     * Este método actualiza la lista de suscripciones en rl panel Admnistración
     * de Suscripciones.
     *
     * @throws DAOException excepción lanzada por la Base de Datos
     */
    private void actualizarListadoSubscriptions() throws DAOException {
        int a = this.modeloTablaSubscriptions.getRowCount();
        int i;
        for (i = 0; i < a; i++) {
            this.modeloTablaSubscriptions.removeRow(0);
        }
        Iterator<SubscriptionDTO> it = this.controlador.listarSubscription().iterator();
        while (it.hasNext()) {
            SubscriptionDTO subscription = it.next();
            Object[] fila = new Object[3];
            fila[0] = subscription.getNombre();
            fila[1] = subscription.getDireccion();
            if (subscription.getActivo()) {
                fila[2] = "Si";
            } else {
                fila[2] = "No";
            }
            this.modeloTablaSubscriptions.addRow(fila);
        }
    }
 
    /**
     * Método que permite central los JDialog y los JPanel.
     */
    private void centrarVentanas() {
        this.setLocationRelativeTo(null);
        this.altaSubscription.setLocationRelativeTo(null);
        this.modificarSubscription.setLocationRelativeTo(null);
        this.eliminarSubscription.setLocationRelativeTo(null);
        this.errorDatosIncompletos.setLocationRelativeTo(null);
        this.errorSeleccionSubscription.setLocationRelativeTo(null);
        this.errorBD.setLocationRelativeTo(null);
        this.errorBusqueda.setLocationRelativeTo(null);
        this.errorSeleccionFeedLeido.setLocationRelativeTo(null);
        this.errorSeleccionFeedNoLeido.setLocationRelativeTo(null);
        this.errorVisualizacion.setLocationRelativeTo(null);
        this.ayuda.setLocationRelativeTo(null);
        this.errorSO.setLocationRelativeTo(null);
        this.errorLecturaFeed.setLocationRelativeTo(null);
        this.errorLecturaSuscripcion.setLocationRelativeTo(null);
    }

    /**
     * Método para mostrar el dialogo y el texto de una excepción de Base de
     * Datos.
     *
     * @param e DAOException
     */
    private void errorBaseDatos(DAOException e) {
        this.textoErrorDB.setText(e.getMessage());
        this.errorBD.setVisible(true);
    }

    // Métodos para el panel Lectura de Feeds
    
    /**
     * Método que carga el JList listListaSubscription con los objetos
     * SubscriptionDTO pasados como parámetro.
     *
     * @param lista List<SubscriptionDTO>
     */
    private void cargarListaSubscription(List<SubscriptionDTO> lista) {
        DefaultListModel modeloListaSubscription = (DefaultListModel) this.listListaSubscription.getModel();
        modeloListaSubscription.removeAllElements();
        Iterator<SubscriptionDTO> iterator = this.listaSubscription.iterator();
        while (iterator.hasNext()) {
            SubscriptionDTO subscription = iterator.next();
            modeloListaSubscription.addElement(subscription);
        }
    }

    /**
     * Método que carga el JTable tablaFeeds con los objetos Feed pasados como parámetros.
     * 
     * @param listaFeeds List<Feed>
     */
    private void cargarTablaFeeds(List<Feed> listaFeeds) {
        /*Este mensaje permite limpiar la tablaFeeds */
        modeloTablaFeeds.eliminarDatos();
        /* Cargamos la listaFeeds en el modelo */
        modeloTablaFeeds.setListaFeeds(listaFeeds);
    }
    
    private void informarLecturasNoExitosas(){
        Iterator<SubscriptionDTO> iterator = listaSubscription.iterator();
        SubscriptionDTO subscription;
        String texto = "";
        while(iterator.hasNext()){
            subscription= iterator.next();
            if (!subscription.isLecturaExitosa()){
                texto= texto + subscription.getNombre() + ", ";
            }
        }
        if(!"".equals(texto)){
            this.textoErrorLecturaSuscripcion.setText(texto);
            this.errorLecturaSuscripcion.setVisible(true);
        }
    }

    /**
     * Método Main de la clase
     * 
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new VentanaFeed().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem acercaDe;
    private javax.swing.JDialog altaSubscription;
    private javax.swing.JDialog ayuda;
    private javax.swing.JButton botonActualizar;
    private javax.swing.JButton botonAltaSubscription;
    private javax.swing.JButton botonAyuda;
    private javax.swing.JButton botonDatosIncompletos;
    private javax.swing.JButton botonEliminarSubscription;
    private javax.swing.JButton botonErrorBusqueda;
    private javax.swing.JButton botonErrorDB;
    private javax.swing.JButton botonErrorFeed;
    private javax.swing.JButton botonErrorFeedSinSeleccionar1;
    private javax.swing.JButton botonErrorLectSusc;
    private javax.swing.JButton botonErrorSO;
    private javax.swing.JButton botonErrorSeleccionFeed2;
    private javax.swing.JButton botonErrorVisualizacion;
    private javax.swing.JButton botonMarcarLeido;
    private javax.swing.JButton botonMarcarNoLeido;
    private javax.swing.JButton botonModificarSubscription;
    private javax.swing.JButton botonNavegador;
    private javax.swing.JButton botonSeleccionSubscription;
    private javax.swing.JTextField campoFiltrar;
    private javax.swing.JTextField campoNombre;
    private javax.swing.JTextField campoNombreModificado;
    private javax.swing.JTextField campoUrl;
    private javax.swing.JTextField campoUrlModificado;
    private javax.swing.JButton cancelarEliminarSubscription;
    private java.awt.Checkbox checkActivo;
    private java.awt.Checkbox checkActivoModificado;
    private javax.swing.JButton confirmarAltaSubscription;
    private javax.swing.JButton confirmarEliminarSubscription;
    private javax.swing.JButton confirmarModificarSubscription;
    private javax.swing.JEditorPane editorContenidoFeed;
    private javax.swing.JDialog eliminarSubscription;
    private javax.swing.JDialog errorBD;
    private javax.swing.JDialog errorBusqueda;
    private javax.swing.JDialog errorDatosIncompletos;
    private javax.swing.JDialog errorLecturaFeed;
    private javax.swing.JDialog errorLecturaSuscripcion;
    private javax.swing.JDialog errorSO;
    private javax.swing.JDialog errorSeleccionFeedLeido;
    private javax.swing.JDialog errorSeleccionFeedNoLeido;
    private javax.swing.JDialog errorSeleccionSubscription;
    private javax.swing.JDialog errorVisualizacion;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JScrollPane jScrollPane7;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JLabel labelSubscription;
    private javax.swing.JList listListaSubscription;
    private javax.swing.JDialog modificarSubscription;
    private javax.swing.JMenuItem salir;
    private javax.swing.JTable tablaFeeds;
    private javax.swing.JTable tablaSubscriptions;
    private javax.swing.JLabel textoAyuda;
    private javax.swing.JLabel textoBusqueda;
    private javax.swing.JLabel textoDatosIncompletos;
    private javax.swing.JLabel textoEliminarSubscription;
    private javax.swing.JLabel textoErrorDB;
    private javax.swing.JLabel textoErrorFeed;
    private javax.swing.JLabel textoErrorLectSusc;
    private javax.swing.JLabel textoErrorLecturaSuscripcion;
    private javax.swing.JLabel textoErrorVisualizacion;
    private javax.swing.JLabel textoFeedSinSeleccionar1;
    private javax.swing.JLabel textoFeedSinSeleccionar2;
    private javax.swing.JLabel textoNombre;
    private javax.swing.JLabel textoNombreModificado;
    private javax.swing.JLabel textoSO;
    private javax.swing.JLabel textoSeleccionSubscription;
    private javax.swing.JLabel textoTituloBusqueda;
    private javax.swing.JLabel textoTituloDatosIncompletos;
    private javax.swing.JLabel textoTituloErrorSO;
    private javax.swing.JLabel textoTituloErrorVisualizacion;
    private javax.swing.JLabel textoTituloFeedSinSeleccionar1;
    private javax.swing.JLabel textoTituloFeedSinSeleccionar2;
    private javax.swing.JLabel textoTituloSeleccionSubscription;
    private javax.swing.JLabel textoUrl;
    private javax.swing.JLabel textoUrlModificado;
    // End of variables declaration//GEN-END:variables
    /**
     * Atributo que representa el Controlador de la aplicación.
     */
    private Fachada controlador;
    /**
     * Atributo que representa el modelo de la JTable tablaFeeds.
     */
    private ModeloTablaFeeds modeloTablaFeeds = new ModeloTablaFeeds();
    /**
     * Atributo que representa el modelo de la JTable tablaSubscriptions. Usamos
     * como modelo para un objeto de la clase DefaultTableModel, pero
     * sobreescribimos el método isCellEditable() para que ninguna celda se
     * pueda editar.
     */
    private DefaultTableModel modeloTablaSubscriptions = new DefaultTableModel() {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
    /**
     * Atributo que representa la lista de suscripciones.
     */
    private List<SubscriptionDTO> listaSubscription;
}
